﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DAL.Modelos;
using DAL;

namespace CuadroMandoIntegralFMCH.Form_s.Prestadores
{
    public partial class PrestadoresImportar : Form
    {
        Modelo modelo = new Modelo();
        public PrestadoresImportar()
        {
            InitializeComponent();
        }

        private void btImportar_Click(object sender, EventArgs e)
        {
            //Abrir archivo de texto plano para poder procesar y guardar las Obras Sociales
            openFileDialog1.FileName = "";
            openFileDialog1.Filter = @"(*.*)|*.*";

            if (openFileDialog1.ShowDialog() != DialogResult.OK) return;

            var path = openFileDialog1.FileName;
            progressBar1.Minimum = 0;
            progressBar1.Maximum = File.ReadAllLines(path).Length;
            backgroundWorker.RunWorkerAsync(path);
        }


        /// <summary>
        /// Procesa un archivo csv plano separado por ; los campos son
        /// sobre prestadores.  
        /// </summary>
        /// <param name="e">ruta de archivo</param>
        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var path = e.Argument as string;
            var i = 1;
            string apellido;
            bool control;
            if (path == null) return;

            var archivo = new StreamReader(path);

            while (archivo.Peek() != -1)
            {
                var linea = archivo.ReadLine();

                if (string.IsNullOrEmpty(linea)) continue;

                var lineaSeparada = linea.Split(';');

                var codPrestador = int.Parse(lineaSeparada[0]);

                var denominacion = lineaSeparada[2];

                //creo el delimitador de que diferencia aquellos prestadres que tienen Apellidos de los que son clinicas
                //o institutos

                string nombre = null;
                if (denominacion.Contains(","))
                {
                    var division = denominacion.Split(',');

                    apellido = division[0];
                    nombre = division[1];
                    control = false;
                }
                else
                {
                    apellido = denominacion;
                    control = true;
                }

                var especialidad = int.Parse(lineaSeparada[3]);

                var matricula = int.Parse(lineaSeparada[4]);

                var cuit = lineaSeparada[5];

                var direccion = lineaSeparada[6];

                var codigoPostal = 0;
                if(!string.IsNullOrEmpty(lineaSeparada[7].Replace(" ","")))
                    codigoPostal = int.Parse(lineaSeparada[7].Replace(".",""));

                var baja = lineaSeparada[9] == "BAJA";

                var fechaNaciemiento = DateTime.Parse("01/01/1111");

                if (!string.IsNullOrEmpty(lineaSeparada[10].Replace(" ","")))
                {
                    var fecha = lineaSeparada[10].Replace(" ", "");
                    fechaNaciemiento = Convert.ToDateTime(fecha);
                }

                var fechaGraduacion = DateTime.Parse("01/01/1111");
                if (!string.IsNullOrEmpty(lineaSeparada[11].Replace(" ","")))
                {
                    var fecha = lineaSeparada[11].Replace(" ", "");
                    fechaGraduacion = Convert.ToDateTime(fecha);
                }

                var documento = lineaSeparada[12].Replace("-", "");

                var fechaCreacion = DateTime.Now;

                var fechaModificacion = DateTime.Now;

                if (control)
                {
                    //es persona juridica
                    var persona = new Persona()
                                          {
                                              Documento = decimal.Parse(documento),
                                              Apellido = apellido,
                                              FechaNacimiento = fechaNaciemiento,
                                              Direccion = direccion,
                                              CodPostal = codigoPostal,
                                              FechaCreacion = fechaCreacion,
                                              FechaModificacion = fechaModificacion,
                                              IdTipoPersona = 2,
                                          };
                    //Verificar si existe el documento de la persona, si existe no se agrega.
                    if (!modelo.VerificacionExistenciaPersona(persona.Documento).status)
                        modelo.AddPersona(persona);
                    modelo.AddPersona(persona);

                    var espe = Especialidad(especialidad);

                    var prestador = new Prestador()
                                        {
                                            CodFacturacion = codPrestador,
                                            Documento = decimal.Parse(documento),
                                            Cuit = cuit,
                                            Matricula = matricula,
                                            Especialidad = espe,
                                            FechaGraduacion = fechaGraduacion,
                                            FechaCreacion = fechaCreacion,
                                            FechaModificacion = fechaModificacion,
                                            BajaLogica = false
                                        };
                    //Verificar si existe el codigo del prestador, si existe no se agrega.
                    if (!modelo.VerificacionExistenciaPrestador(prestador.CodFacturacion).status)
                        modelo.AddPrestador(prestador);
                    modelo.AddPrestador(prestador);
                }
                else
                {
                    //es persona física
                    var persona = new Persona()
                                            {
                                                Documento = decimal.Parse(documento),
                                                Apellido = apellido,
                                                Nombres = nombre,
                                                FechaNacimiento = fechaNaciemiento,
                                                Direccion = direccion,
                                                CodPostal = codigoPostal,
                                                FechaCreacion = fechaCreacion,
                                                FechaModificacion = fechaModificacion,
                                                IdTipoPersona = 1,
                                            };
                    //Verificar si existe el documento de la persona, si existe no se agrega.
                    if (!modelo.VerificacionExistenciaPersona(persona.Documento).status)
                        modelo.AddPersona(persona);

                    var espe = Especialidad(especialidad);

                    var prestador = new Prestador()
                                            {
                                                CodFacturacion = codPrestador,
                                                Documento = decimal.Parse(documento),
                                                Cuit = cuit,
                                                Matricula = matricula,
                                                Especialidad = espe,
                                                FechaGraduacion = fechaGraduacion,
                                                FechaCreacion = fechaCreacion,
                                                FechaModificacion = fechaModificacion,
                                                BajaLogica = false
                                            };
                    //Verificar si existe el codigo del prestador, si existe no se agrega.
                    if (!modelo.VerificacionExistenciaPrestador(prestador.CodFacturacion).status)
                        modelo.AddPrestador(prestador);

                }

                //Reporte de progreso de lineas leidas.
                backgroundWorker.ReportProgress(i);
                i++;


            }
        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Visible = true;
            lbImportar.Visible = true;
            btImportar.Enabled = false;
            progressBar1.Value = e.ProgressPercentage;
            lbImportar.Text = e.ProgressPercentage.ToString() + @"archivos leidos";
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar1.Visible = false;

            if (e.Error != null)
            {
                MessageBox.Show(@"Error: " + e.Error.Message, @"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show(@"Finalizo la Importación", @"Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        public string Especialidad(int espe)
        {
            string especialidad;
            switch (espe)
            {
                case 1:
                    especialidad = "ALERGIA E INMUNOLOGIA";
                    break;
                case 2:
                    especialidad = "ANATOMIA PATOLOGICA";
                    break;
                case 3:
                    especialidad = "ANESTESIOLOGIA";
                    break;
                case 4:
                    especialidad = "CARDIOLOGIA";
                    break;
                case 5:
                    especialidad = "CIRUGIA GENERAL";
                    break;
                case 6:
                    especialidad = "CIRUGIA CARDIOVASCULAR";
                    break;
                case 7:
                    especialidad = "CIRUGIA PEDIATRICA";
                    break;
                case 8:
                    especialidad = "CIRUGIA TORAXICA";
                    break;
                case 9:
                    especialidad = "CIRUGIA PLASTICA Y REPARADORA";
                    break;
                case 10:
                    especialidad = "CLINICA MEDICA";
                    break;
                case 11:
                    especialidad = "DERMATOLOGIA";
                    break;
                case 12:
                    especialidad = "DIAGNOSTICO POR IMAGENES";
                    break;
                case 13:
                    especialidad = "ECOGRAFIA";
                    break;
                case 14:
                    especialidad = "ENDOCRINOLOGIA";
                    break;
                case 15:
                    especialidad = "GASTROENTEROLOGIA";
                    break;
                case 16:
                    especialidad = "GENETICA";
                    break;
                case 17:
                    especialidad = "HEMATOLOGIA Y HEMOTERAPIA";
                    break;
                case 18:
                    especialidad = "INFECTOLOGIA";
                    break;
                case 19:
                    especialidad = "MEDICINA DEL DEPORTE";
                    break;
                case 20:
                    especialidad = "MEDICINA GENERAL";
                    break;
                case 21:
                    especialidad = "MEDICINA LEGAL";
                    break;
                case 22:
                    especialidad = "MEDICINA NUCLEAR";
                    break;
                case 23:
                    especialidad = "MEDICINA DEL TRABAJO";
                    break;
                case 24:
                    especialidad = "NEFROLOGIA";
                    break;
                case 25:
                    especialidad = "NEUMONOLOGIA";
                    break;
                case 26:
                    especialidad = "NEUMOTISIOLOGIA";
                    break;
                case 27:
                    especialidad = "NEUROLOGIA";
                    break;
                case 28:
                    especialidad = "NEUROCIRUGIA";
                    break;
                case 29:
                    especialidad = "NUTRICION";
                    break;
                case 30:
                    especialidad = "OFTALMOLOGIA";
                    break;
                case 31:
                    especialidad = "ONCOLOGIA";
                    break;
                case 32:
                    especialidad = "OTORRINOLARINGOLOGIA";
                    break;
                case 33:
                    especialidad = "PEDIATRIA";
                    break;
                case 34:
                    especialidad = "NEONATOLOGIA";
                    break;
                case 35:
                    especialidad = "PSIQUITRIA";
                    break;
                case 36:
                    especialidad = "REUMATOLOGIA";
                    break;
                case 37:
                    especialidad = "RADIOLOGIA";
                    break;
                case 38:
                    especialidad = "FISIATRIA Y KINESIOLOGIA";
                    break;
                case 39:
                    especialidad = "SALUD PUBLICA";
                    break;
                case 40:
                    especialidad = "TERAPIA INTENSIVA";
                    break;
                case 41:
                    especialidad = "TERAPIA RADIANTE";
                    break;
                case 42:
                    especialidad = "GINECOLOGIA";
                    break;
                case 43:
                    especialidad = "OBSTETRICIA Y PERINATOLOGIA";
                    break;
                case 44:
                    especialidad = "TOXICOLOGIA";
                    break;
                case 45:
                    especialidad = "UROLOGIA";
                    break;
                case 46:
                    especialidad = "TRAUMATOLOGIA Y ORTOPEDIA";
                    break;
                case 47:
                    especialidad = "GERIATRIA";
                    break;
                case 48:
                    especialidad = "CLINICA CARDIOLGICA Y PEDIATRICA";
                    break;
                case 49:
                    especialidad = "NEUMONOLOGIA PEDIATRICA";
                    break;
                case 50:
                    especialidad = "NEUROPEDIATRIA";
                    break;
                case 51:
                    especialidad = "UNIDAD CORONARIA";
                    break;
                case 52:
                    especialidad = "TISIOLOGIA";
                    break;
                case 80:
                    especialidad = "MEDICINA RURAL";
                    break;
                case 81:
                    especialidad = "TOCOGINECOLOGIA";
                    break;
                case 82:
                    especialidad = "AUDITORIA MEDICA";
                    break;
                case 83:
                    especialidad = "INTERNACIONES GENERALES";
                    break;
                case 84:
                    especialidad = "ECO-DOPPLER";
                    break;
                case 85:
                    especialidad = "FLEBOLOGIA";
                    break;
                case 86:
                    especialidad = "LINFOLOGIA";
                    break;
                case 87:
                    especialidad = "CITOLOGIA";
                    break;
                case 88:
                    especialidad = "ANGIOLOGIA";
                    break;
                case 89:
                    especialidad = "ENDOSCOPIA";
                    break;
                default:
                    especialidad = "No identifica";
                    break;

            }

            return especialidad;
        }


    }
}
